package com.yc;

import dev.langchain4j.community.model.dashscope.QwenEmbeddingModel;
import dev.langchain4j.data.embedding.Embedding;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.store.embedding.EmbeddingSearchRequest;
import dev.langchain4j.store.embedding.EmbeddingSearchResult;
import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore;

public class RAG_App2 {
    public static void main(String[] args) {
        //阶段一:向量化+向量数据库
        //1.向量模型
        QwenEmbeddingModel qwenEmbeddingModel = QwenEmbeddingModel.builder()
                .apiKey(System.getenv("ALI_API_KEY"))
                .build();

        //2.向量数据库
        InMemoryEmbeddingStore<TextSegment> embeddingStore =new InMemoryEmbeddingStore();

        //3利用向量模型进行向量化,然后储存向量到向量数据库中
        TextSegment textSegment = TextSegment.from("""
        预订钻戒：
            -通过我们的网站或APP预订，您可以轻松拥有个个性化的钻戒，以表达您的情戚和想法。
            -预订时需要全额付款，3天内包退换
            -确保个人信息（姓名，身份证号，手机号等）的准确性，因为更正可能会产生额外10元的费用，""");
        Embedding embedding1 =qwenEmbeddingModel.embed(textSegment).content();
        embeddingStore.add(embedding1,textSegment);

        TextSegment segments2 =TextSegment.from("""
        取消预订：
            -最晚取消时间为发货前24小时前
            -取消费用：普通钻戒20元/件，钻石钻成30元/件
            -退款将在7个工作日内处理wnu""");
        Embedding embedding2 = qwenEmbeddingModel.embed(segments2).content();
        embeddingStore.add(embedding2,segments2);


        //////////////1阶段二：匹配向最
        Embedding queryEmbedding=qwenEmbeddingModel.embed("退订需要手续费吗？").content();
//创建清求
        EmbeddingSearchRequest build= EmbeddingSearchRequest.builder()
                .queryEmbedding(queryEmbedding)
                .maxResults(2)//返回最相以的前2条数据
                .minScore(0.7)
                .build();
//开始搜索
        EmbeddingSearchResult<TextSegment> result=embeddingStore.search(build );
//输出结果
        result.matches().forEach(embeddingMatch->{
            System.out.println(embeddingMatch.score()+"\t"+embeddingMatch.embedded().text());
        });
    }
}
